package com.hmall.pay.domain.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;

/**
 * 支付下单表单数据传输对象
 * 用于前端向支付系统提交支付请求的表单数据
 * 包含支付所需的核心业务参数
 */
@Data
@Builder
@ApiModel(description = "支付下单表单实体，用于提交支付请求")
public class PayApplyDTO {

    /**
     * 业务订单ID
     * 关联业务系统中的订单ID（如交易订单表的order_id）
     * 必须填写，用于支付与业务订单的关联
     */
    @ApiModelProperty(value = "业务订单ID", required = true, example = "1001")
    @NotNull(message = "业务订单ID不能为空")
    private Long bizOrderNo;

    /**
     * 支付金额
     * 以"分"为单位的支付金额
     * 必须为正整数，避免零金额或负金额支付
     */
    @ApiModelProperty(value = "支付金额（单位：分）", required = true, example = "19900")
    @Min(value = 1, message = "支付金额必须为正数")
    private Integer amount;

    /**
     * 支付渠道编码
     * 标识支付来源渠道（如支付宝、微信、余额等）
     * 必须填写，用于路由到对应的支付渠道
     * 示例值：ALIPAY（支付宝）、WECHAT（微信支付）、BALANCE（余额支付）
     */
    @ApiModelProperty(value = "支付渠道编码", required = true, example = "ALIPAY")
    @NotNull(message = "支付渠道编码不能为空")
    private String payChannelCode;

    /**
     * 支付类型
     * 标识支付的终端类型或场景
     * 必须填写，用于支付渠道生成对应类型的支付链接或二维码
     * 1：H5支付，2：小程序支付，3：公众号支付，4：扫码支付，5：余额支付
     */
    @ApiModelProperty(value = "支付类型", required = true, example = "1")
    @NotNull(message = "支付方式不能为空")
    private Integer payType;

    /**
     * 订单商品信息
     * 包含订单中商品的详细信息
     * 必须填写，用于支付渠道展示商品信息和风控校验
     * 格式：JSON字符串，包含商品名称、价格、数量等字段
     */
    @ApiModelProperty(value = "订单商品信息", required = true, example = "[{\"name\":\"商品1\",\"price\":19900,\"num\":1}]")
    @NotNull(message = "订单中的商品信息不能为空")
    private String orderInfo;

}